package com.zh.business.base.service;

import com.github.pagehelper.PageInfo;

import java.util.List;

/**
 * 服务基类接口
 *
 * @author walle
 */
public interface BasicServiceInterface<T> {
    /**
     * 根据实体中的不为null的属性进行查询
     * 只能有一个返回值，有多个结果时抛出异常，查询条件使用等号 and
     *
     * @param record
     * @return
     */
    T selectOne(T record);


    /**
     * 根据实体中不为null的属性值进行查询，查询条件使用等号
     *
     * @param record
     * @return
     */
    List<T> select(T record);

    /**
     * 查询全部
     *
     * @return
     */
    List<T> selectAll();

    /**
     * 根据实体类不为null的字段进行排序查询，条件全部使用=号and条件
     * 需要指定排序规则，例如 "name ase",使用属性名，而非数据库字段名
     *
     * @param record      查询条件
     * @param orderSqlStr 排序规则 （如：name ase,id desc）
     * @return List 列表
     */
    List<T> selectOrder(T record, String orderSqlStr);

    /**
     * 根据实体中不为null的属性查询总数，查询条件使用等号
     *
     * @param record
     * @return 总数结果
     */
    int selectCount(T record);

    /**
     * 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
     * 单个字段做主键时,可以直接写主键的值。联合主键时,key可以是实体类,也可以是Map
     *
     * @param key
     * @return
     */
    T selectByPrimaryKey(Object key);

    /**
     * 根据主键字段判断是否存在。方法参数必须包含完整的主键属性，查询条件使用等号
     *
     * @param key
     * @return 是否存在
     */
    boolean existsWithPrimaryKey(Object key);

    /**
     * 保存或者更新，根据传入id主键是不是null来确认
     *
     * @param record 对象
     * @return int 影响行数
     */
//    int save(T record);

    /**
     * 保存一个实体，null的属性也会保存，不会使用数据库默认值
     *
     * @param record
     * @return int 插入行数
     */
    int insert(T record);

    /**
     * 保存一个实体，null的属性不会保存，会使用数据库默认值
     *
     * @param record
     * @return int 插入行数
     */
    int insertSelective(T record);

    /**
     * 根据主键更新实体全部字段，null值会被更新进库
     *
     * @param record
     * @return int 更新行数
     */
    int updateByPrimaryKey(T record);

    /**
     * 根据主键更新实体属性不为null的值
     *
     * @param record
     * @return int 更新行数
     */
    int updateByPrimaryKeySelective(T record);

    /**
     * 根据实体类不为null的字段进行删除,条件全部使用=号and条件
     *
     * @param record 对象
     * @return int 删除行数
     */
    int delete(T record);

    /**
     * 根据主键字段进行删除,这里最多只会删除一条数据
     * 单个字段做主键时,可以直接写主键的值 联合主键时,key可以是实体类,也可以是Map
     *
     * @param key 主键
     * @return int 删除行数
     */
    int deleteByPrimaryKey(Object key);

    /**
     * 单表分页不可排序
     *
     * @param pageNum  页码，1开始
     * @param pageSize 每页显示数量
     * @param record   对象
     * @return PageInfo 分页对象
     */
    PageInfo<T> selectPage(int pageNum, int pageSize, T record);

    /**
     * 单表分页可排序
     *
     * @param pageNum     页码，1开始
     * @param pageSize    每页显示数量
     * @param record      对象
     * @param orderSqlStr 排序规则 (如:id desc)
     * @return PageInfo 分页对象
     */
    PageInfo<T> selectPageOrder(int pageNum, int pageSize, T record, String orderSqlStr);
}
